# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a random change phone.
拥有一定的手机号段存储在excel，通过它随机生成指定地区的手机号
"""

'''
@Author: ysz
@Date: 2020-01-02 11:59:32
@LastEditors  : ysz
@LastEditTime : 2020-01-02 15:54:07
@Description: 随机生成手机号
'''


import numpy as np
import pandas as pd
import random
import string



class Random_Phone(object):
 
    
    
# =============================================================================
     def __init__(self,filename):
          '''
          @description: 初始化方法，传入要读取的文件路径
          @param1: {
          *      filename:"文件路径",
          *      }
          @return: 无返回值
          @detail: 给对象添加属性
          '''        
         
         
          self.file=filename
# =============================================================================



# =============================================================================
     def obtain_data(self,sheetname):
 
         '''
         @description: 从指定读取的excel文件中，获取数据
         @param1: {
         *      sheetname:"工作表的名称",
         *      }
         @return: excel数据
         @detail: 读取excel文件，并获取数据
         
         '''
         
         data=pd.read_excel(r'./手机号段归属地表.xlsx',sheet_name=sheetname).copy()
         #data的类型是数据框的形式
         return data
# =============================================================================



# =============================================================================
     def process_data(self,data,city,number):
 
           '''
           @description: 处理数据，拼成手机号
           @param1: {
           *      data:"从数据表里获取的数据",
           *      city:想要生成的手机号的归属地
           *      number:随机生成的手机号的数量
           *      }
           @return: 无
           @detail: 根据从excel中获取的指定地区的号段，
           拼成手机号，然后每个表里面的数据量是一定的，
           不应超过，如果超过，则应该创建新的数据表，进行存储
           '''
           if data.empty:
               return False
           
           phone_list=data.loc[data['地区']==city,:]  #获取指定的地区的数据
           phone_list=phone_list['手机号码段']          #只获取号段
           #拼成手机号
           
           phone_list=np.random.permutation(phone_list)   #打乱数据的原先的顺序
           beauti_phone=pd.Series([])
           i=1
           while i<=number:                               #根据用户输入的数量生成指定的数据
               a=np.random.choice(phone_list,size=1)
               end = ''.join(random.sample(string.digits,4))     
               phone=a+end
               beauti_phone=beauti_phone.append(pd.Series(phone),ignore_index=True)  #每生成一个手机号，就存储到series中，并放到指定的series中
               i+=1
           beauti_phone.name='手机号'
           beauti_phone.index=range(1,number+1)
           num=beauti_phone.shape[0]%30000   #每一工作表里用存放的数据量
           i=beauti_phone.shape[0]/num+1     #生成几个工作表   
           j=0
           writer=pd.ExcelWriter('./'+city+'.xlsx')
           while j<i-1:
               print(beauti_phone.loc[j*num:j*num+num])
               beauti_phone.loc[j*num:j*num+num].to_excel(writer,"sheet"+str(j+1))
               j+=1
           writer.save()     #保存工作簿里面的数据到硬盘里
           return True
# =============================================================================

       
        
# =============================================================================
     def run(self,number,city):
          '''
          @description: 运行函数，
          @param1: {
          *      number:"想要生成的手机号的数量",
          *      city:想要生成的手机号的归属地
          *      }
          @return: 无
          @detail: 从获取数据的函数开始执行，
           获取完数据之后，把数据传递给处理数据函数，
           然后对数据进行处理，最后执行存储
          '''
          sheetname='Sheet2'
          data=self.obtain_data(sheetname)
          print(len(data))
          if self.process_data(data,city,number):
             return True
          else:
             return False
# =============================================================================
       


# =============================================================================
if __name__ == "__main__":
     
#        '''
#            @description: 整个程序执行的入口
#            @detail: 根据用户的输入，执行相应的判断
#        '''
        filename='手机号段归属地表.xlsx'
        rp=Random_Phone(filename)
         
        while True:
            number=input("请输入要随机生成的手机号的个数或输入q离开：")
            if number=='q':
                print('欢迎下次再来！！！！')
                break
            city=input("请输入要生成的手机号的归属地城市名称：")
            if number.isdigit():
                if rp.run(int(number),city):
                    print('存储成功')
                else:
                    print('没有您想要的手机的号段，请重新输入')
            else:
                print('数量或归属地输入有误，请重新输入！！！')
# =============================================================================


        
    
    